package com.jdk._01_函数式接口;

import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;

/**
 * 函数式接口（类的定义与适应形式，只是一种类的定义形式，属于新增语法）
 * 包：java.util.function
 * 条件：接口中 有，且，只有一个，必须实现的抽象方法
 * 通过注解检查 @FunctionalInterface进行代码检查提示
 * 函数式接口，支持Lambda表达式 也就是说：参数可以长这样  "()->{}"
 * <p>
 * JDK1.8内置,四种函数式接口
 * 1.消费型 Consumer<T> return：无
 * 2.提供型 Supplier<T> return：<T>
 * 3.函数型 Function<T,R> return：<R>
 * 4.断言型 Predicate<T> return：boolean
 * <p>
 * 参数使用形式
 * 形式1：传递函数式接口对象
 * 形式2：形参上直接写表达式
 */
public class _Test {

    //000.自定义
    static {

        //声明函数，相当于接口实现
        FunctionFace03<String, String, String> face003 = (a, b, c) -> {
            System.out.println(a);
            System.out.println(b);
            System.out.println(c);
        };

        //调用
        face003.add1("1", "2", "3");
    }

    /**
     * 静态方法，参数为函数式接口对象
     *
     * @param c
     * @param s
     * @param f
     * @param p
     */
    static void test1(Consumer<String> c,
                      Supplier<String> s,
                      Function<String, Integer> f,
                      Predicate<String> p) {

    }

    /**
     * 测试类
     *
     * @param args
     */
    public static void main(String[] args) {

        //1.消费型
        //类：<T>
        //参数：<T>
        //return：无
        Consumer<String> c = (param) -> {
            System.out.println("1.消费型");
        };

        //2.提供型
        //类：<T>
        //参数：无
        //return：<T>
        Supplier<String> s = () -> {
            System.out.println("2.提供型");
            return "";
        };

        //3.函数型
        //类：<T,R>
        //参数：<T>
        //return：<R>
        Function<String, Integer> f = (param) -> {
            System.out.println("3.函数型");
            return 0;
        };

        //4.断言型
        //类：<T>
        //参数：<T>
        //return：boolean
        Predicate<String> p = (param) -> {
            System.out.println("4.断言型");
            return true;
        };


        //应用：形式1：传递函数式接口对象
        test1(c, s, f, p);

        //应用：形式2：形参上直接写表达式
        test1(
                (param) -> {
                    System.out.println("1.消费型");
                },

                () -> {
                    System.out.println("2.提供型");
                    return "";
                },

                (param) -> {
                    System.out.println("3.函数型");
                    return 0;
                },

                (param) -> {
                    System.out.println("4.断言型");
                    return true;
                }
        );
    }

}
